Ticking Block Entity以及其他

您所在的位置:网站首页 class mod什么意思 Ticking Block Entity以及其他

Ticking Block Entity以及其他

2023-11-29 21:47| 来源: 网络整理| 查看: 265

看到有玩家问这个报错

这类在Ticking Tile Entity或者Ticking Block Entity时候发生的报错,一般有一个简单的解决方案。

操作方式

简单来说,就是找到forge.cfg,把里面removeErroringTileEntities(删除报错的方块实体)设为true即可。这样,每当有TileEntity/BlockEntity报错的时候,它们就会直接被删掉。如果你解决不了问题,你至少可以解决掉那个方块实体。

(嗯对,“方块实体”,简称TE,它不是“实体”的一种,而是一类完全不同的存在,一般伴随着特定方块升成与销毁。作为MC代码层面的概念,没亲自写过mod或者插件的老玩家可能玩了几年都没听说过这么个东西。)

同理,如果是实体报错,你可以把上面那个removeErroringEntities设为true。

这类报错见到的最常见的是植物魔法的魔力池报错,在为空气的格子上发现魔力池的TE,然后tick一下就炸了。一般认为这种爆炸来自小地图,可以靠删小地图mod或者打开上面的选项来解决。

就今早我看到的那封不是植物魔法的崩溃日志来说,它的情况有点不同。

Description: Ticking block entity

java.lang.ClassCastException: micdoodle8.mods.galacticraft.core.entities.player.GCEntityPlayerMP cannot be cast to net.minecraft.inventory.IInventory

    at net.minecraft.tileentity.TileEntityHopper.getInventoryAtPosition(TileEntityHopper.java:552)

这个报错如果你懂代码的话,会发现有点反常。它说,星系mod的玩家对象不能被类型转化为MC的背包接口IInventory。

1,但凡拜读过含星系mod日志的人都会知道,星系mod给玩家引入了不同于原版的类,GCEntityPlayer。

2,玩家有背包。

难道是星系mod搞事情写出bug了?

我们看看堆栈。

 at net.minecraft.tileentity.TileEntityHopper.getInventoryAtPosition(TileEntityHopper.java:552)

    at net.minecraft.tileentity.TileEntityHopper.getSourceInventory(TileEntityHopper.java:513)

    at net.minecraft.tileentity.TileEntityHopper.pullItems(TileEntityHopper.java:303)

    at net.minecraft.tileentity.TileEntityHopper.updateHopper(TileEntityHopper.java:142)

Hopper,这不是漏斗吗,我们看看TileEntityHopper的代码不就知道了。

TileEntityHopper(1.12.2)

List list = worldIn.getEntitiesInAABBexcluding((Entity)null, new AxisAlignedBB(x - 0.5D, y - 0.5D, z - 0.5D, x + 0.5D, y + 0.5D, z + 0.5D), EntitySelectors.HAS_INVENTORY);

这就是报错的那一行,因为太长而在一张图里放不下了。简单来说,就是获取了漏斗上面格子里的所有、有背包的生物。HAS_INVENTORY是什么标准呢?

EntitySelectors.HAS_INVENTORY

标准是实现IInventory接口,并且处于存活状态。好家伙。那么因此被选中的GCEntityPlayer怎么可能会不能被转化为IInventory呢?我们看看后面。

报错的方块实体

它是原版的漏斗方块,而TE却是泡沫修复的魔改后的快速漏斗。好,我血压已经上来了。看到这种关于优化、修复类报错的日志我就想打人。切记:看不懂崩溃日志就不要装这种mod。

那么是不是泡沫修复把这个HAS_INVENTORY的判断去掉导致的呢?

我看了下泡沫修复的源码里的TileEntityFasterHopper,它并没有改getInventoryAtPosition方法。事实上你也可以看到,堆栈里全都是原版的漏斗TE,没有出现泡沫修复的TE。

日志里的星系mod

于是我转而去看星系mod。日志里的版本是281,于是我去官网找那个版本的星系……

官网

星系的官网最新才是280!我原地问号。算了,拿着280凑合吧。

GCEntityPlayerMP,出自GalacticCraftCore

这不就继承EntityPlayerMP吗?看起来什么问题也没有啊。如果你看原版MP的话,你会发现原版的MP并不实现IInventory,玩家类都不直接实现。InventoryPlayer类才是实现接口的那个,并且它只是MP的成员,并不是MP的基类。所以,GCEntityPlayerMP不应该被那个实体选择器选中才是。

老天爷,就先到这吧。鬼知道为什么。那么多coremod,我可没时间一个个去查谁改了原版的方法。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3